package com.fourpigeon.service.impl;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.fourpigeon.dao.*;
import com.fourpigeon.domain.*;
import com.fourpigeon.service.BlogService;
import com.fourpigeon.service.BlogUpdateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;

import static com.fourpigeon.utils.RedisConstants.BLOG_TTL_KEY;

@Service("blogUpdateService")
public class BlogUpdateServiceImpl extends BlogServiceImpl implements BlogUpdateService {
    @Autowired
    private BlogDailyDao blogDailyDao;
    @Autowired
    private BlogAgreeDao blogAgreeDao;
    @Autowired
    private BlogPracticeDao blogPracticeDao;
    @Autowired
    private BlogDealDao blogDealDao;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Autowired
    private UserDao userDao;

    /**
     * 用户更新日常贴信息
     * @param blogDailyDTO 前端数据
     * @param blogId 日常贴id
     * @return 结果信息
     */
    @Override
    public Result updateDaily(BlogDailyDTO blogDailyDTO, Long blogId) {
        //检验用户id
        if (!checkUser()) {
            return Result.fail("请先登录!");
        }
        //获取原blog
        BlogDaily blogDaily = blogDailyDao.getById(blogId);
        if (blogDaily == null) {
            return Result.fail("贴子不存在!");
        }
        //检验更新内容是否一致
        if (blogDaily.isMatch(blogDailyDTO)){
            return Result.ok("更新成功!");
        }
        blogDaily.update(blogDailyDTO);
        //更新到MySQL数据库
        blogDailyDao.update(blogDaily);
        //返回信息
        return Result.ok("更新成功!");
    }

    /**
     * 用户更新交易贴信息
     * @param blogDealDTO 前端数据
     * @param blogId 交易贴id
     * @return 结果信息
     */
    @Override
    public Result updateDeal(BlogDealDTO blogDealDTO, Long blogId) {
        if (!checkUser()) {
            return Result.fail("请先登录!");
        }
        //获取原blog
        BlogDeal blog = blogDealDao.getById(blogId);
        //检验更新内容是否一致
        blog = blog.matchAndUpdate(blogDealDTO);
        if (blog == null) {
            return Result.ok("更新成功!");
        }
        //更新到MySQL数据库
        blogDealDao.update(blog);
        //返回信息
        return Result.ok("更新成功!");
    }

    /**
     * 用户更新约球贴信息
     * @param blogAgreeDTO 前端数据
     * @param blogType 约球贴级别
     * @param blogId 博客id
     * @return 结果信息
     */
    @Override
    public Result updateAgreement(BlogAgreeDTO blogAgreeDTO, Short blogType, Long blogId) {
        if (!checkUser()) {
            return Result.fail("请先登录!");
        }
        //获取原blog
        if (!agreeGetMap.containsKey(blogType)) {
            return Result.fail("不存在这个贴子!");
        }
        BlogAgree blog = agreeGetMap.get(blogType).apply(blogId);
        //检验更新内容是否一致
        blog = blog.matchAndUpdate(blogAgreeDTO);
        if (blog == null){
            return Result.ok("更新成功!");
        }
        //更新到MySQL数据库
        if (!agreeUpdateMap.containsKey(blogType)) {
            return Result.fail("类型错误!请联系工作人员!") ;
        }
        agreeUpdateMap.get(blogType).apply(blog);
        //返回信息
        return Result.ok("更新成功!");
    }

    /**
     * 用户更新陪教贴信息
     * @param blogPracticeDTO 接收的前端请求数据
     * @param blogId 博客id
     * @return 结果信息
     */
    @Override
    public Result updatePractice(BlogPracticeDTO blogPracticeDTO, Long blogId) {
        //检验用户id
        if (!checkUser()) {
            return Result.fail("请先登录!");
        }
        BlogPractice blog = blogPracticeDao.getById(blogId);
        if (blog == null) {
            return Result.fail("不存在这个贴子!");
        }

        blog = blog.matchAndUpdate(blogPracticeDTO);
        if (blog == null) {
            return Result.ok("更新成功!");
        }
        blogPracticeDao.update(blog);
        return Result.ok("更新成功!");
    }
}
